package sample.game.othello.gui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;

import javax.swing.JLabel;
import javax.swing.JPanel;

/**
 * オセロ用パネルクラス。
 * パネルの位置と状態（白、黒、未指定）を保持している。
 *
 */
public class OthelloPanel extends JPanel {

	/** 誰もコインを置いていない状態の色 */
	private static final Color NONE = new Color(0, 102, 0);
	
	/** コインを表すもの */
	private JLabel label;
	
	/** コインの状態 */
	private State state;
	
	/** パネルの位置 */
	private int idx;
	
	/**
	 * コンストラクタ。
	 * 
	 * @param idx パネルの位置
	 */
	public OthelloPanel(int idx) {
		// サイズ指定
		setSize(new Dimension(30,30));
		// 色初期化
		setBackground(NONE);
		// レイアウト設定
		setLayout(new BorderLayout());
		
		// コイン
		label = new JLabel("●");
		// フォント
		label.setFont(new Font("MSゴシック", Font.PLAIN, 50));
		// 表示位置
		label.setHorizontalAlignment(JLabel.CENTER);
		label.setVerticalAlignment(JLabel.CENTER);
		
		// パネルのコイン用ラベルを追加
		add(label, BorderLayout.CENTER);
		
		// 状態
		state(State.NONE);
		// 位置
		this.idx = idx;
	}
	

	/**
	 * 状態を設定する
	 * 
	 * @param state 状態
	 */
	public void state(State state) {
		this.state = state;
		label.setForeground(state.color());
	}
	
	/**
	 * コインが置かれていない状態かチェックする
	 * 
	 * @return true:コインなし/false:白か黒が置かれている
	 */
	public boolean blank() {
		return State.NONE.equals(this.state);
	}
	
	/**
	 * 指定した状態と同じかチェックする
	 * 
	 * @param state 状態
	 * @return true:一緒/false:異なる
	 */
	public boolean same(State state) {
		return this.state.equals(state);
	}

	/**
	 * 位置を取得する
	 * 
	 * @return 位置
	 */
	public int idx() {
		return this.idx;
	}
	
	/**
	 * X座標を取得する
	 * 
	 * @return X座標
	 */
	public int x() {
		return this.idx % OthelloWindow.Y_SIZE;
	}
	
	/**
	 * Y座標を取得する
	 * 
	 * @return Y座標
	 */
	public int y() {
		return this.idx / OthelloWindow.Y_SIZE;
	}

	/**
	 * X座標とY座標から位置を取得する
	 * 
	 * @param x X座標
	 * @param y Y座標
	 * @return 位置
	 */
	public static int idx(int x, int y) {
		return (x % OthelloWindow.X_SIZE + y * OthelloWindow.Y_SIZE);
	}
	
	/**
	 * コインの状態を表すenum。
	 * 
	 */
	public static enum State {
		BLACK(Color.BLACK),
		WHITE(Color.WHITE),
		NONE(OthelloPanel.NONE),
		;
		
		private Color color;
		private State(Color color) {
			this.color = color;
		}
		
		public Color color() {
			return this.color;
		}
	}
	
	/**
	 * バージョンID。
	 */
	private static final long serialVersionUID = -1242684201255512223L;

}
